package com.chorye.function.pdf.write.service;

import com.chorye.function.pdf.read.entity.Student;
import com.chorye.function.pdf.read.mapper.StudentMapper;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;

/**
 * @Company: 北京XXXX有限公司
 * @Author JiangYy
 * @Title: PdfWriteService
 * @Description: TODO
 * @Date 2019/7/23 10:55
 */
@Service
public class PdfWriteService {

    @Autowired
    private StudentMapper studentMapper;

    /**
     * 导出pdf数据
     *
     * @param response 响应
     */
    public void exportPDF(HttpServletResponse response) {
        // 查询要导出的数据
        List<Student> students = studentMapper.selectAll();
        // 获取表头模板
        String[] templates = resolveHeaders();
        // 取出
        if (templates != null && templates.length > 2) {
            // 表头行
            String header = templates[0];
            // 取到了
            if (StringUtils.isNotBlank(header)) {
                // 按照空格拆分
                // 第一行的表头值
                String[] headers = header.split(" ");
                // 创建并导出pdf
                createPdf("学生文件导出.pdf", headers, students, response);

            }
        }


    }

    /**
     * 创建并导出pdf
     *
     * @param fileName 文件名称
     * @param headers  表头行
     * @param students 数据
     * @param response 响应
     */
    private void createPdf(String fileName, String[] headers, List<Student> students, HttpServletResponse response) {
        // A4纸张
        Document document = new Document(PageSize.A4);
        PdfWriter writer = null;
        OutputStream out = null;
        // 获取输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            // 打开文件
            document.open();
            // 获取writer
            writer = PdfWriter.getInstance(document, baos);
            // 文件名
            document.addTitle(fileName);
            // 换行
            document.add(new Chunk("\n"));
            // 打开文件
            document.open();
            // 创建导出的表格
            PdfPTable table = createTable(document, headers, students);
            // 在文档中加入表格
            document.add(table);
            // 关闭文件
            document.close();
            // 设置请求返回类型为下载pdf文件
            response.setContentType("application/pdf");
            // attachment改为inline，则直接在浏览器预览
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            response.setContentLength(baos.size());
            out = response.getOutputStream();
            baos.writeTo(out);
            out.flush();
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流信息
            try {
                if (writer != null) {
                    writer.close();
                }
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

    /**
     * 创建表格
     *
     * @param document 文档对象
     * @param headers  表头
     * @param students 导出数据
     * @return 创建的表格
     * @throws DocumentException 文档相关异常
     */
    private PdfPTable createTable(Document document, String[] headers, List<Student> students) throws DocumentException {
        PdfPTable table = new PdfPTable(headers.length);
        PdfPCell cell;
        // 表头字体，定义为蓝色加粗
        Font headerFont = setChineseFont();
        headerFont.setColor(BaseColor.BLUE);
        headerFont.setStyle(Font.BOLD);
        // 正文文字字体
        Font contentFont = setChineseFont();
        contentFont.setColor(BaseColor.RED);

        // 标题
        for (int i = 0; i < headers.length; i++) {
            cell = new PdfPCell(new Paragraph(headers[i], headerFont));
            // 居中对齐
            cell.setHorizontalAlignment(1);
            // 将单元格加入表格
            table.addCell(cell);
        }
        for (Student student : students) {
            // 编号
            cell = new PdfPCell(new Paragraph(String.valueOf(student.getId()), contentFont));
            table.addCell(cell);
            // 姓名
            cell = new PdfPCell(new Paragraph(String.valueOf(student.getName()), contentFont));
            table.addCell(cell);
            // 年龄
            cell = new PdfPCell(new Paragraph(String.valueOf(student.getAge()), contentFont));
            table.addCell(cell);
            // 住址
            cell = new PdfPCell(new Paragraph(String.valueOf(student.getAddress()), contentFont));
            table.addCell(cell);
            // 工资
            cell = new PdfPCell(new Paragraph(String.valueOf(student.getSalary()), contentFont));
            table.addCell(cell);
            // 电话
            cell = new PdfPCell(new Paragraph(String.valueOf(student.getMobile()), contentFont));
            table.addCell(cell);

            // 换行（导出不建议加，加了后读分页的时候有概率会有问题需要额外处理）
            document.add(new Chunk("\n"));
        }
        return table;
    }

    /**
     * 产生PDF字体
     *
     * @return 字体
     */
    private Font setChineseFont() {
        Font fontChinese = null;
        try {
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            fontChinese = new Font(bf);
        } catch (DocumentException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return fontChinese;
    }

    /**
     * @return
     */
    private String[] resolveHeaders() {
        PdfReader pdfReader;
        TextExtractionStrategy strategy;
        try {
            // 读取表头模板文件
            pdfReader = new PdfReader("C:\\Users\\new\\Desktop\\chorye\\pdf-test\\template.pdf");
            // 获取当前pdf页数
            int pages = pdfReader.getNumberOfPages();
            // 拼接字符串
            StringBuffer buffer = new StringBuffer();
            // 获取pdf读取的内容转换器
            PdfReaderContentParser parser = new PdfReaderContentParser(pdfReader);
            // 循环处理每一页的内容，注意，1代表第一页，不是从0开始
            for (int i = 1; i <= pages; i++) {
                // 创建内容处理策略为：文本提取
                strategy = parser.processContent(i, new SimpleTextExtractionStrategy());
                // 拼接文本内容
                buffer.append(strategy.getResultantText());
            }
            // 获取结果
            String headerStr = buffer.toString();
            // 如果表头不为空
            if (StringUtils.isNotBlank(headerStr)) {
                // 拆分头
                String[] headers = headerStr.split("\n");
                // 如果有值
                if (headers.length > 0) {
                    return headers;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 任何不满足返回null
        return null;
    }
}
